package start.spring.basic.job.job;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;

import lombok.extern.slf4j.Slf4j;
import start.spring.basic.exception.ExceptionUtil;
import start.spring.basic.job.quartz.QuartzConstant;
import start.spring.basic.job.service.demo.IDemoService;

/**
 * 
 * ****************************************************************************
 * 自动任务串行执行样例
 * 使用@DisallowConcurrentExecution注解保证任务串行执行，适用于单线程处理业务的情况。
 *
 * @author(作者)：xuyongyun	
 * @date(创建日期)：2021年5月7日
 ******************************************************************************
 */
@Slf4j
@DisallowConcurrentExecution
public class DemoJob2 extends BaseJob implements Job {
	
	private String className = getClass().getName();
	
	@Autowired
	IDemoService demoService;
	
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		String errMsg = "";
		String jobStatus = QuartzConstant.JOB_STATUS_WAITING;
		try {
			//任务是否可执行
			if(super.jobCanExcute(className,context)) {
				//任务可执行
				//修改自动任务开始执行
				super.reJobStart(className);
				
				//执行自动任务的业务逻辑
				demoService.queryInterfaceVersionFromFeignClient();
				
				//设置任务执行成功
				jobStatus = QuartzConstant.JOB_STATUS_SUCC;
				
				//记录执行成功日志
				super.reJobEnd(jobStatus, errMsg, className);
			}
		}catch(Exception e) {
			errMsg = ExceptionUtil.getExceptionDeteil(e, 0);
			log.error("",e);
			
			//设置任务执行失败
			jobStatus = QuartzConstant.JOB_STATUS_FAIL;
			
			//记录执行失败日志
			super.reJobEnd(jobStatus, errMsg, className);
		}
	}
}
